import axios from "axios"
import { Message } from "element-ui";
import { getToken, removeToken } from "@/utils/cookies.js";
import { MessageBox } from "element-ui";
import router from "@/router/index.js"

// 创建axios实例
const instance = axios.create({
    // 接口前缀 启动服务器时相对路径会自动拼接上浏览器的域名
    baseURL: "/student/v3/prod-api",
    timeout: 3000,
})

//请求拦截器 发送请求时
instance.interceptors.request.use(config => {
    console.log(config);//当前发送这个接口的详细信息

    const { isToken =true} = config

    if (isToken&&getToken()) {
        // 请求头的字段名一定要去看接口文档,不固定的，由后端决定的
        //Bearer字段由后端决定,没有特殊说明就不需要加
        // 更加快速验证是哪个用户
        config.headers["Authorization"] = "Bearer " + getToken()
    }

    //发送接口请求
    return config
})


// 响应拦截器
instance.interceptors.response.use(
    res => {
        // axios的状态

        // 统一处理错误的状态码
        if (res.data.code !== 200) {
            // 登录过期 401
            if (res.data.code === 401) {
                handleTokenExpired()
                return Promise.reject(new Error("登录状态已失效"))
            }

            Message.error(res.data.msg || '操作失败')
            console.log("响应拦截器", res);

            // Promise.reject()调用 reject()
            return Promise.reject(new Error(res.data.msg||'操作失败'))
        }

        return res.data
    },
    err => {
        console.log(err);
        Message.error(err.response.data.message)

        return Promise.reject(new Error(err.response.data.message))
    }
)

/**
 * 处理401token失效
 * @param {*} 
 */
function handleTokenExpired() {
    //清除过期的token值
    removeToken()

    // 提示用户请先登录
    MessageBox.confirm("登录状态已过期，请重新登录!", '系统提示', {
        type: 'warning',
        confirmButtonText: "重新登录"
    }).then(() => {
        router.replace("/login")
    })

}


// 导出axios实例
export default instance